/*
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */
 
/* $Id: thread.c 16 2007-06-10 02:10:04Z kf701.ye $ */

#include <pthread.h>

#include "kf701.h"

/**
 * @brief create a thread normal priority
 *
 * @param th_func thread main func
 * @param data delived to thread
 *
 * @retval false create faild
 * @retval true create ok
 */
bool create_normal_thread(thread_entry_func th_func, void *data)
{
	pthread_t threadid;
	if( pthread_create(&threadid, NULL, th_func, data) )
	{
		sys_message("%s,%d: pthread_create error\n",__FILE__,__LINE__);
		return false;
	}
	return true;
}

/**
 * @brief create a real-time thread, heigh priority
 *
 * @param th_func thread main func
 * @param data delived to thread
 *
 * @return false or true
 *
 */
bool create_rr_thread(thread_entry_func th_func, void *data)
{
	pthread_t threadid;		// thread identifiers
	pthread_attr_t threadAttr1;	// thread attributes
	struct sched_param param;	// scheduling priority
	int policy = SCHED_RR;		// scheduling policy - real time
	if( pthread_attr_init(&threadAttr1) )
	{
		sys_message("%s,%d: pthread_attr_init error\n",__FILE__,__LINE__);
		return false;
	}
	if( pthread_attr_setdetachstate(&threadAttr1, PTHREAD_CREATE_DETACHED) )
	{
		sys_message("%s,%d: pthread_attr_setdetachstate error\n",__FILE__,__LINE__);
		return false;
	}
	/* Set the policy of the thread to real time */
	if ( pthread_attr_setschedpolicy(&threadAttr1, policy) )
	{
		sys_message("%s,%d: pthread_attr_setschedpolicy error\n",__FILE__,__LINE__);
		return false;
	}
	/* Set the scheduling priority of the thread - max priority */
	param.sched_priority = 90;
	if( pthread_attr_setschedparam(&threadAttr1, &param) )
	{
		sys_message("%s,%d: pthread_attr_setschedparam error\n",__FILE__,__LINE__);
		return false;
	}
	if( pthread_create(&threadid, &threadAttr1, th_func, data) )
	{
		sys_message("%s,%d: pthread_create error\n",__FILE__,__LINE__);
		return false;
	}
	return true;
}
